package com.lmy.springboot.project.lambda;

public class Test {

    public static void main(String[] args) {
        //传统方式来实现函数式接口，得到一个实现接口的对象
        //可以实现匿名内部类
//        LmyFunction<Desk, String> hf = new LmyFunction<Desk, String>() {
//
//            @Override
//            public String apply(Desk desk) {
//                return "hello desk";
//            }
//        };
//        String string = hf.apply(new Desk());
//        System.out.println(string); //hello desk

        //hf2已经实现了LmyFunction
        LmyFunction<Desk, String> hf2 = Desk::getName;
        //以下写法报错，因为hello返回空，不满足函数式接口的抽象方法要求
//        LmyFunction<Desk, String> hf3 = Desk::hello;
        //以下写法也报错，因为getAge返回整型类型。
//        LmyFunction<Desk, String> hf4 = Desk::getAge;
        String str = hf2.apply(new Desk());
        hf2.ok();
        System.out.println(str);
    }
}

//定义一个函数式接口:有且只有一个抽象方法
//可以使用@FunctionalInterface 来标识一个函数式接口
//LmyFunction就是一个函数式接口，也是一个自定义泛型接口
@FunctionalInterface
interface LmyFunction<T,R> {
    R apply(T t);   //抽象方法；表示根据类型T的参数，获取类型R的结果

    //函数式接口，可以有多个默认实现方法
    default public void ok() {
        System.out.println("ok");
    }
}

@FunctionalInterface
interface LmyFunction2 {
    public void hi();
}

class Desk {    //Bean
    private String name = "hello lmy";

    private Integer age = 10;

    public String getName() {
        return name;
    }

    public Integer getAge() {
        return age;
    }

    public void hello() {
        System.out.println("hello");
    }
}